#ifndef _STACK_HPP_
#define _STACK_HPP_


#include "DoubleLinkList.hpp"

template<typename T>
class Stack
{
public:
    Stack();
    void Push(const T& value);
    ~Stack();
    void Pop();
    T& GetTop();
    bool IsEmpty();
private:
    DoubleLinkList<T> list;
};

template <typename T>
 Stack<T>::Stack()
{
}

template <typename T>
void Stack<T>::Push(const T &value)
{
    list.InsertHead(value);
}

template <typename T>
Stack<T>::~Stack()
{

}

template <typename T>
 void Stack<T>::Pop()
{
    list.RemoveHead();
}

template <typename T>
 T &Stack<T>::GetTop()
{      
    if(list.Size() == 0)
    {
        throw 0;
    }
    return list.GetHead();
}

template <typename T>
 bool Stack<T>::IsEmpty()
{
    return list.Size() == 0;
}

#endif

